home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-15
/
ports.zip
/
PORTS.ASM
< prev
Wrap
Assembly Source File
|
1992-12-28
|
12KB
|
257 lines
;
;
TITLE PORTS.ASM
;
; Purpose: Diagnostic tool to monitor up to 16 ports and display
; data being received from them.
;
; Created: 02-OCT-1987 Richard B. Johnson
;
; Note(s): This program must be assembled as a '.COM' file.
; MASM PORTS;
; LINK PORTS;
; EXE2BIN PORTS.EXE PORTS.COM
; DEL PORTS.EXE
;
; Modified:
; Added provision to write a fixed byte to the ports before
; reading the port. 03-OCT-1987 (RBJ)
;
CR EQU 0DH
LF EQU 0AH
MS_DOS EQU 21H ; DOS SOFTWARE INTERRUPT
VIDEO EQU 10H ; VIDEO ROM BIOS INTERRUPT
KBD EQU 16H ; KEYBOARD ROM BIOS INTERRUPT
;
PSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:PSEG, DS:PSEG, ES:PSEG, SS:NOTHING
ORG 100H
MAIN PROC NEAR
CALL CLS ; CLEAR THE SCREEN
MOV SI,OFFSET PRP1 ; POINT TO PROMPT
MOV DI,OFFSET PORTS ; WHERE ARE PORT LOCATIONS
GETINP: CALL DISPLAY ; DISPLAY PROMPT
CALL CONIN ; GET INPUT ASCII
JZ NOMORE ; NO MORE INPUT
CALL PARSE ; PARSE INPUT STRING
STOSW ; SAVE PORT ADDRESS
INC BYTE PTR [NUM_PRT] ; NEXT
MOV SI,OFFSET PRP2 ; POINT TO SECOND PROMPT
JMP SHORT GETINP ; AND CONTINUE GETTING DATA
NOMORE: MOV SI,OFFSET PRP4 ; POINT TO WANT TO WRITE?
CALL DISPLAY ; PRINT TO SCREEN
CALL CONIN ; GET BUFFERED RESPONSE
JZ NOWRT ; NOTHING TYPED
MOV AL,BYTE PTR [CONBUF+2] ; GET TYPED BYTE
AND AL,95 ; MAY TO UPPER CASE
CMP AL,'Y' ; WAS IT WRITE?
JNZ NOWRT ; NO
MOV BYTE PTR [WFLAG],-1 ; YES, SET THE FLAG
MOV SI,OFFSET PRP6 ; POINT TO 'ENTER BYTE'
CALL DISPLAY ; PRINT TO SCREEN
CALL CONIN ; GET EDITED STRING
CALL PARSE ; RETURN BINARY FROM HEX
MOV BYTE PTR [OBYTE],AL ; SAVE THE BYTE FOR WRITE
NOWRT: CALL CLS ; CLEAR THE SCREEN
CALL KIL_CUR ; KILL CURSOR
MOV SI,OFFSET PRP5 ; POINT TO 'HIT ANY KEY'
CALL DISPLAY ; PRINT TO SCREEN
AGAIN: CALL DPORTS ; DISPLAY PORTS
MOV AH,1 ; CHECK FOR ABORT
INT KBD
JZ AGAIN ; NO ABORT
MOV AH,0 ; GET INPUT BYTE
INT KBD ; FLUSH AND EXIT
JMP FINIS
MAIN ENDP
;
; Convert HEX word in AX to string addressed by DI.
;
HEXW PROC NEAR
PUSH AX ; SAVE WORD
MOV AL,AH ; HIGH BYTE INTO AL
CALL HEX ; CONVERT
POP AX ; FALL THROUGH
;
; Convert binary in AL to hexadecimal string addressed by DI
;
HEX PROC NEAR ; CONVERT BYTE IN AL TO HEX
MOV AH,AL ; SAVE A COPY
ROL AL,1 ; SHIFT OVER FOUR BITS
ROL AL,1
ROL AL,1
ROL AL,1
CALL HEX2
MOV AL,AH ; GET BYTE BACK
HEX2: AND AL,0FH ; MASK HIGH BITS
ADD AL,90H ; MAKE LIKE PACKED DECIMAL
DAA ; ADJUST (OLD INTEL TRICK)
ADC AL,40H ; ISOLATE A-F
DAA ; 0 - A REMOVED
STOSB ; SAVE ASCII
RET
HEX ENDP
HEXW ENDP
;
; Return Binary in AX from HEX ASCII string addressed by SI.
;
PARSE PROC NEAR
MOV SI,OFFSET CONBUF + 1 ; POINT TO BYTE COUNT
LODSB ; GET BYTES TYPED
MOV CL,AL ; USE AS COUNT
XOR CH,CH ; ZERO HIGH BYTE
XOR BX,BX ; START WITH ZERO
XOR AH,AH ; SAME HERE
PAR1: SHL BX,1 ; * 2
SHL BX,1 ; * 4
SHL BX,1 ; * 8
SHL BX,1 ; * 16
LODSB ; GET BYTE
SUB AL,'0' ; ASCII BIAS
JC EXIT ; CHECK RANGE
CMP AL,10 ; LESS THAN 10?
JC LRANGE ; YES, LOW RANGE
AND AL,95 ; MAP TO UPPER CASE
SUB AL,7 ; MUST BE A-F
CMP AL,16 ; MORE THAN 15?
JNC EXIT ; YES, BAD
LRANGE: ADD BX,AX ; ACCUMULATE
LOOP PAR1 ; PICK UP ALL INPUT
EXIT: MOV AX,BX ; GET RESULT
RET
PARSE ENDP
;
; Put edited console text in a buffer called CONBUF
;
CONIN PROC NEAR
MOV BYTE PTR [CONBUF],5 ; MAX CHARACTERS
MOV DX,OFFSET CONBUF ; POINT TO BUFFER
MOV AH,0AH ; BUFFERED INPUT
INT MS_DOS
CMP BYTE PTR [CONBUF+1],0 ; CHECK FOR ANYTHING TYPED
RET
CONIN ENDP
;
; Print on the screen ASCII characters addressed by SI until a null.
;
DISPLAY PROC NEAR
MOV BX,1Eh ; ATTRIBUTE (yellow/blue)
DISP: LODSB ; GET BYTE
OR AL,AL ; TEST FOR NULL
JZ DONE ; END OF STRING
MOV AH,14 ; DUMB TERMINAL MODE
INT VIDEO ; ROM BIOS
JMP SHORT DISP ; CONT
DONE: RET
DISPLAY ENDP
;
; Display all the selected ports.
;
DPORTS PROC NEAR
MOV AH,2 ; SET CURSOR POSITION
XOR BX,BX ; PAGE ZERO
MOV DX,0500H ; ROW FIVE/COL ZERO
INT VIDEO
MOV CL,BYTE PTR NUM_PRT ; GET NUMBER OF PORTS
XOR CH,CH ; ZERO HIGH BYTE
JCXZ NONE ; NO PORTS
MOV SI,OFFSET PORTS ; POINT TO PORT LOCATIONS
DPOR: LODSW ; GET PORT ADDRESS
PUSH CX ; SAVE COUNT
PUSH SI ; SAVE PORT ADDRESS
MOV DX,AX ; SAVE IN DX
MOV DI,OFFSET HPORT ; POINT TO ASCII STRING SPACE
CALL HEXW ; CONVERT HEX WORD
CMP BYTE PTR [WFLAG],0 ; WANT TO WRITE?
JZ NOWAY ; DON'T WRITE
MOV AL,BYTE PTR [OBYTE] ; GET OUTPUT BYTE
OUT DX,AL ; OUTPUT THE BYTE
PUSH AX ; EXERCISE
POP AX
NOWAY: IN AL,DX ; GET BYTE AT PORT
MOV DI,OFFSET VPORT ; POINT TO VALUE IN STRING
CALL HEX ; CONVERT TO HEX
MOV SI,OFFSET PRP3 ; POINT TO STRING
CALL DISPLAY ; DISPLAY ON SCREEN
POP SI ; RESTORE PORT LOC
POP CX ; RESTORE COUNT
LOOP DPOR ; CONTINUE
NONE: RET
DPORTS ENDP
;
; Clear the screen.
;
CLS PROC NEAR
MOV AX,0600H ;ERASE/SCROLL SCREEN
MOV DH,24 ;25TH ROW
MOV DL,79 ;80TH COLUMN
XOR CX,CX ;HOME POSITION
MOV BH,7
INT VIDEO
MOV AH,2 ;SET CURSOR POSITION
XOR DX,DX ;UPPER LEFT HAND CORNER
MOV BH,0 ;PAGE ZERO
INT VIDEO
RET
CLS ENDP
;
FINIS PROC NEAR
MOV SI,OFFSET PEXIT ; POINT TO 'EXIT' STRING
CALL DISPLAY ; PRINT TO SCREEN
CALL RES_CUR ; RESTORE CURSOR
MOV AX,4C00H ; RETURN TO DOS EXIT CODE 00
INT MS_DOS
CLI ; IN CASE ITS BROKE
HLT ; HARD STOP
FINIS ENDP
;
; Save cursor type and then remove it.
;
KIL_CUR PROC NEAR
MOV AH,3 ; CURSOR POOSITION/TYPE
XOR BX,BX ; PAGE ZERO
INT VIDEO
MOV WORD PTR [CURSOR],CX ; SAVE CURSOR TYPE
MOV CX,-1 ; MAKE DISAPPEAR
MOV AH,1 ; SET CURSOR TYPE
INT VIDEO
RET
KIL_CUR ENDP
;
; Restore cursor.
;
RES_CUR PROC NEAR
MOV CX,WORD PTR [CURSOR] ; MAKE NEW AGAIN
MOV AH,1 ; SET CURSOR TYPE
INT VIDEO
RET
RES_CUR ENDP
;
NUM_PRT DB 0 ; NUMBER OF PORTS
WFLAG DB 0 ; WRITE FLAG
OBYTE DB 0 ; OUTPUT BYTE
PORTS DW 16 DUP(0)
;
PRP1 DB CR,LF
HEAD DB 27 DUP(' ')
DB '- Port diagnostic tool -'
DB CR,LF
DB CR,LF,'Enter [Return] only to complete address list.'
PRP2 DB CR,LF,'Enter port address(s) (HEX) : ',0
PRP3 DB CR,LF,'Port '
HPORT DB 'FFFF = '
VPORT DB 'FF',0
LEN EQU $ - PRP3
PRP4 DB CR,LF,'Write to the port(s) Y/N ? ',0
PRP6 DB CR,LF,'Enter byte to write (HEX) : ',0
PRP5 DB CR,LF,'Hit any key to quit.',0
PEXIT DB CR,LF,LF,'End.',CR,LF,0
CURSOR DW ?
CONBUF LABEL BYTE
;
PSEG ENDS
END MAIN
DB CR,LF,'Hit any key to quit.',0
PEXIT DB CR,LF,LF,'End.',CR,LF,0
CURSOR